﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos

Public Class TiposProductosBL
    Public Function RegistrarTipoDeProducto(ByVal TokenConexion As String, ByVal tipoProd As TiposProductos, ByRef detResp As DetalleRespuesta) As Boolean
        Dim tiposProdDAL As TiposProductosDAL = New TiposProductosDAL("")
        detResp.Mensajes = ""
        Try
            If (EsValidoParaRegistrar(tipoProd, detResp.Mensajes)) Then
                tiposProdDAL = New TiposProductosDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                If (tiposProdDAL.existeTipoProducto(tipoProd.Clave)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_PreviamenteRegistrado,
                                             "Existe un registro con la clave del Tipo de Producto indicado." & vbCrLf & detResp.Mensajes)
                    Return False
                Else
                    If (tiposProdDAL.registraTipoProducto(tipoProd)) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "El Tipo de Producto se registro con éxito.")
                        Return True
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                 "El Tipo de Producto no pudo ser registrado en el sistema." & vbCrLf &
                                                 "Verifique que la Familia a la que está asignado este Tipo de Producto esté registrada en el sistema." & vbCrLf & detResp.Mensajes)
                        Return False
                    End If
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Tipo de Producto no es valido para registrar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.RegistrarTipoDeProducto")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al Registrar Tipo de Producto: " & ex.Message)
            Return False
        Finally
            tiposProdDAL = Nothing
        End Try
    End Function

    Private Function EsValidoParaRegistrar(ByRef pTipoProd As TiposProductos, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(pTipoProd.Clave)) Then
                mensaje &= "La Clave del Tipo de Producto es obligatoria, no puede ir el campo vacio." & vbCrLf
            Else
                pTipoProd.Clave = pTipoProd.Clave.Trim
                If (pTipoProd.Clave.Length > 15) Then
                    pTipoProd.Clave = pTipoProd.Clave.Substring(0, 15)
                End If
            End If

            If (String.IsNullOrWhiteSpace(pTipoProd.Descripcion)) Then
                mensaje &= "La Descripción del Tipo de Producto es obligatoria, no puede ir el campo vacio." & vbCrLf
            Else
                pTipoProd.Descripcion = pTipoProd.Descripcion.Trim
                If (pTipoProd.Descripcion.Length > 80) Then
                    pTipoProd.Descripcion = pTipoProd.Descripcion.Substring(0, 80)
                End If
            End If

            If (pTipoProd.Familia Is Nothing OrElse String.IsNullOrEmpty(pTipoProd.Familia.IdFamilia)) Then
                mensaje &= "El Identificador de la Familia a la que pertenece el Tipo de Producto es obligatoria." & vbCrLf
            Else
                If (pTipoProd.Familia.IdFamilia <= 0) Then
                    mensaje &= "El Identificador de la Familia a la que pertenece el Tipo de Producto debe existir previamente en el Sistema." & vbCrLf
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function ActualizaTipoDeProducto(ByVal TokenConexion As String, ByVal tipoProd As TiposProductos, ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim tiposProdDAL As TiposProductosDAL = New TiposProductosDAL("")
        Try
            If (EsValidoParaRegistrar(tipoProd, detResp.Mensajes)) Then
                tiposProdDAL = New TiposProductosDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                If (tiposProdDAL.actualizaTipoProducto(tipoProd)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Datos de Tipo de Producto Actualizados.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de Datos del Tipo de Producto." & vbCrLf &
                                             "Verifique que el Tipo de Producto y la Familia a la que pertenece estén registrados en el Sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.ActualizaTipoDeProducto")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al actualizar Tipo de Productos: " & ex.Message)
            Return False
        Finally
            tiposProdDAL = Nothing
        End Try
    End Function

    Public Function CambiaEstatus(ByVal tokenConexion As String, ByVal Clave As String, ByVal setActivo As Boolean,
                                           ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim tiposProdDAL As TiposProductosDAL = New TiposProductosDAL("")
        Try
            If (EsValidoParaGetTipoProducto(Clave, detResp.Mensajes)) Then
                tiposProdDAL = New TiposProductosDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                If (tiposProdDAL.cambiaStatus(Clave, setActivo)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Estatus de Tipo de Producto Actualizado.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de estatus del Tipo de Producto." & vbCrLf &
                                             "Verifique que la Clave del Tipo de Producto esté registrada en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.CambiaEstatus")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar estatus del Tipo de Producto: " & ex.Message)
            Return False
        Finally
            tiposProdDAL = Nothing
        End Try
    End Function

    Public Function GetTipoProducto(ByVal tokenConexion As String, ByVal Clave As String, ByRef detResp As DetalleRespuesta) As TiposProductos
        detResp.Mensajes = ""
        Dim tipoProdDAL As TiposProductosDAL = New TiposProductosDAL("")
        Dim tipoProdBE As TiposProductos
        Try
            If (EsValidoParaGetTipoProducto(Clave, detResp.Mensajes)) Then
                tipoProdDAL = New TiposProductosDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                tipoProdBE = tipoProdDAL.getTipoProducto(Clave)
                If (tipoProdBE IsNot Nothing) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Se obtuvo la información del Tipo de Producto con éxito.")
                    Return tipoProdBE
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "No se obtuvo la información del Tipo de Producto" & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La Clave del Tipo de Producto contiene valor invalido " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.GetTipoProducto")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al obtener información del Tipo de Producto: " & ex.Message)
            Return Nothing
        Finally
            tipoProdDAL = Nothing
            tipoProdBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetTipoProducto(ByRef pClave As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrEmpty(pClave)) Then
                mensaje &= "El campo Clave del Tipo de Producto no puede ir  vacio." & vbCrLf
            Else
                pClave = pClave.Trim
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.EsValidoParaGetTipoProducto")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetListadoTiposProducto(ByVal tokenConexion As String, ByVal Clave As String, ByVal Descripcion As String,
                                            ByVal ClaveFamilia As String, ByVal estatus As Enumeraciones.estatusParaBusquedas,
                                            ByVal pRegistroInicial As Integer, ByVal pPageSize As Integer,
                                            ByVal pSortColumn As Enumeraciones.campoOrdenamiento, ByVal pSortDirection As Enumeraciones.tipoOrdenamiento,
                                            ByRef pTotalRegistros As Integer,
                                            ByRef detResp As DetalleRespuesta) As List(Of TiposProductos)
        detResp.Mensajes = ""
        pTotalRegistros = 0
        Dim tipProdDAL As TiposProductosDAL = New TiposProductosDAL("")
        Dim lsTiposProd As List(Of TiposProductos)
        Try
            tipProdDAL = New TiposProductosDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
            lsTiposProd = tipProdDAL.getListadoTiposProducto(Clave, Descripcion, ClaveFamilia, estatus, pRegistroInicial,
                                                             pPageSize, pSortColumn, pSortDirection, pTotalRegistros)
            If (lsTiposProd IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de Tipos de Producto con éxito.")
                Return lsTiposProd
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                         "No se obtuvo el listado de los Tipos de Productos" & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.GetListadoTiposProducto")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener el listado de Tipos de Productos: " & ex.Message)
            Return Nothing
        Finally
            tipProdDAL = Nothing
            lsTiposProd = Nothing
        End Try
    End Function

    Public Function ExisteTipoProductoPorID(ByVal tokenConexion As String, ByVal Id As Integer) As Boolean
        Dim tipoProdDAL As TiposProductosDAL = New TiposProductosDAL("")
        Try
            tipoProdDAL = New TiposProductosDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
            Return tipoProdDAL.existeTipoProductoPorID(Id)
        Catch ex As Exception
            Log.LogException(ex, "TiposProductosBL.ExisteTipoProductoPorID")
            Return False
            Return Nothing
        Finally
            tipoProdDAL = Nothing
        End Try
    End Function
End Class
